package data;

public class Tuple 
{
	public double real_value;
	public double approximate_value;
	public static final int OPEN=0;
	public static final int CLOSE=1;
	
	public Tuple()
	{
		
	}
	
	/**
	 * ����һ��Ԫ�飬������ʵֵ�����ֵ�����н���ֵ��pe�ĸ��ʾ�����������ʵֵ�Ƿ����仯��
	 * <p>��ʵֵ����0��n�а��վ��ȷֲ����ʣ��������</p>
	 * <p>����ֵ����0��kn�����ѡ��һ��ֵ</p>
	 */
	public Tuple(double k, int n, double pe)
	{
		this.real_value=n*Math.random();
		
		double change=Math.random();
		if(change>=0.5)
		{
			this.approximate_value=k*n*Math.random();
		}
	}
	/**
	 * ����һ��Ԫ�飬������ʵֵ�����ֵ�����н���ֵ��pe�ĸ��ʾ�����������ʵֵ�Ƿ����仯��
	 * <p>��ʵֵ����0��n�а��վ��ȷֲ����ʣ��������</p>
	 * <p>����ֵ����0��n�����ѡ��һ��ֵ</p>
	 */
	public Tuple(int n, double k, double pe, int type)
	{
		double min,max;
		this.real_value=n*Math.random();
		
		if(type==Tuple.OPEN)
		{
			/*
			this.approximate_value=this.real_value;
			double change=Math.random();
			if(change<=pe)
			{
				//this.approximate_value=2*n*k*Math.random()-n*k;
				this.approximate_value=2*n*k*Math.random();
				//this.approximate_value=n*k*Math.random();
			}
			*/
			this.approximate_value=this.real_value;
			double change=Math.random();
			if(change<=pe)
			{
				//this.approximate_value=2*n*k*Math.random()-n*k;
				min=this.real_value-k*n;
				max=this.real_value+k*n;
				this.approximate_value=min+(max-min)*Math.random();
				//this.approximate_value=n*k*Math.random();
			}
			
		}
		else if(type==Tuple.CLOSE)
		{
			this.approximate_value=this.real_value;
			double change=Math.random();
			if(change<=pe)
			{
				//this.approximate_value=2*n*k*Math.random()-n*k;
				min=Math.max(0, this.real_value-k*n);
				max=Math.min(n, this.real_value+k*n);
				this.approximate_value=min+(max-min)*Math.random();
				//this.approximate_value=n*k*Math.random();
			}
			
		}
		
	}
	
	public boolean is_order_changed(Tuple other)
	{
		if(this.real_value>=other.real_value && this.approximate_value<other.approximate_value)
		{
			return true;
		}
		if(this.real_value<=other.real_value && this.approximate_value>other.approximate_value)
		{
			return true;
		}
		return false;
	}
	public String toString()
	{
		return "real="+this.real_value+",approximate="+this.approximate_value;
	}
}
